function Demo<T>(args:T):T[]{
    return [args,args]
}
// 这应该很清楚的类型定义了
let newDemo:{<T>(arg:T):T[]} = Demo


// 俺在弄一个接口
interface Demo2{
    <U>(a:U):U[]
}

let newDemo2:Demo2 = Demo

// 在扩展一下 对接口是用 变量类型 ：将变量当作类型传给接口 美滋滋
interface Demo3<Y>{
    (b:Y):Y[]
}

// 此处传入的 变量类型是 number 则说明改函数 接受的变量只能是number
let newDemo3:Demo3<number> = (arg:number):number[]=>{
    return [arg]
}
// 将变量类型前后改不统一
let newDemo4:Demo3<string> = (arg:number):number[]=>{
    return [arg]
}
let newDemo5:Demo3<number> = (arg:string):string[]=>{
    return [arg]
}

// 定义前后不统一类型的接口 传入任何类型 都返回 string
interface Demo4<T>{
    (arg:T):string
}
// 为啥 null 和 number 类型兼容呢？
const newDemo6:Demo4<null> =(list:number)=>{
    return "string"
}
// string 和 number 不兼容
const newDemo7:Demo4<string> =(list:number)=>{
    return "string"
}